iT邦幫忙

0

Day16改進策略問題(1)

d16
  • 分享至 

  • xImage
  •  

原先的策略不太嚴謹所以,增加了一些判斷標準,例如:
RSI 在 50 以上且模型預測漲 → 做多
RSI 在 50 以下且模型預測跌 → 做空
MACD 趨勢方向:僅當 MACD 與 Signal 線方向一致時才進場。
MA 趨勢:僅當價格在 MA20 或 MA50 之上(上漲趨勢)才考慮做多。
又再增加了止損/止盈規則例如:
止損 1%
止盈 2%
動態止損:依 ATR 設定止損距離(例如 ATR × 1.5)

def backtest_strategy(df, y_true, y_pred, test_index, initial_capital=10000,
                       position_size=0.1, atr_multiplier=1.5, take_profit_ratio=0.02):
    """
    改進版回測:
    1. RSI 濾波
    2. ATR 動態止損
    3. 固定止盈比例
    4. 倉位管理
    """
    df_test = df.iloc[test_index].copy()
    df_test['True'] = y_true
    df_test['Pred'] = y_pred

    capital = initial_capital
    equity_curve = [capital]

    for i in range(1, len(df_test)):
        price_prev = df_test['close'].iloc[i-1]
        price_now = df_test['close'].iloc[i]

        # 計算真實報酬率
        ret = (price_now / price_prev) - 1

        # 進場條件:RSI 濾波
        rsi = df_test['RSI'].iloc[i]
        pred = df_test['Pred'].iloc[i-1]
        atr = df_test['ATR'].iloc[i]

        enter_trade = False
        if pred == 1 and rsi > 50:  # 預測漲且 RSI 支持上漲
            enter_trade = True
            direction = 1
        elif pred == 0 and rsi < 50:  # 預測跌且 RSI 支持下跌
            enter_trade = True
            direction = -1

        if enter_trade:
            position_capital = capital * position_size
            stop_loss = atr * atr_multiplier
            take_profit = take_profit_ratio * price_now

            # 模擬止損 / 止盈
            if direction == 1:  # 多單
                if ret <= -stop_loss / price_now:
                    ret = -stop_loss / price_now
                elif ret >= take_profit_ratio:
                    ret = take_profit_ratio
            else:  # 空單
                if ret >= stop_loss / price_now:
                    ret = -stop_loss / price_now
                elif ret <= -take_profit_ratio:
                    ret = take_profit_ratio

            strategy_ret = direction * ret
            capital += capital * position_size * strategy_ret

        equity_curve.append(capital)

    df_test['Equity'] = equity_curve

    # 畫資金曲線
    plt.figure(figsize=(12,6))
    plt.plot(df_test['timestamp'], df_test['Equity'], label="Equity Curve", color="blue")
    plt.axhline(initial_capital, linestyle="--", color="gray", alpha=0.7)
    plt.title("Backtest Equity Curve (改進版策略)")
    plt.xlabel("Time")
    plt.ylabel("Capital")
    plt.legend()
    plt.xticks(rotation=45)
    plt.show()

    total_return = (capital / initial_capital - 1) * 100
    print(f"💰 最終資金: {capital:.2f} USDT")
    print(f"📈 總報酬率: {total_return:.2f}%")

    return df_test

https://ithelp.ithome.com.tw/upload/images/20251005/20178967SirdtGyueb.png


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言